// 函数指针数组示例
// 函数指针可以存储在数组中，用于处理多个函数，尤其在实现命令表或分支逻辑时非常方便。
#include <stdio.h>

int add(int a, int b)
{
  return a + b;
}

int substract(int a, int b)
{
  return a - b;
}

int main()
{
  int arr[] = {10, 20, 30, 40};
  int *p = arr;        // p指向数组的第一个元素
  int (*p2)[4] = &arr; // p2是指向包含4个整数的数组的指针
  printf("p: %p\n", (void *)p);
  printf("p+1: %p\n", (void *)(p + 1)); // 增加4字节（假设int为4字节）
  printf("p2: %p\n", (void *)p2);
  printf("p2+1: %p\n", (void *)(p2 + 1)); // 增加16字节（4个int，每个4字节）

  printf("初始状态: p指向 %d (地址: %p)\n", *p, (void *)p);
  p++;
  // 选项A: p++
  printf("\n选项A: p++\n");
  printf("*(p++) = %d\n", *p); // 输出20
  printf("p指向: %d (地址: %p)\n", *p, (void *)p);

  ++p; // p实际移动到下一个整数
  // 选项B: ++p
  printf("\n选项B: ++p\n");
  printf("*(++p) = %d\n", *p); // 输出30
  printf("p指向: %d (地址: %p)\n", *p, (void *)p);

  // 选项C: p = p + 1
  printf("\n选项C: p = p + 1\n");
  p = p + 1; // p实际移动到下一个整数
  printf("p指向: %d (地址: %p)\n\n", *p, (void *)p);
  // 定义函数指针数组
  int (*operation[])(int, int) = {add, substract};

  // 通过函数指针数组调用函数
  int addResult = operation[0](5, 10);
  int subResult = operation[1](5, 10);
  printf("加法结果：%d\n", addResult);
  printf("减法结果：%d\n", subResult);

  return 0;
}